package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.ord.entity.OrdOrderTracking;
import com.sz.biz.logistics.ord.entity.OrdSubOrder;
import com.sz.biz.logistics.ord.entity.OrderStatus;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.biz.logistics.ord.dto.OrdSubOrderDto;

import java.util.List;
import java.util.Map;

/**
 * Function: 子订单的service <br>
 * Author: hpeng.wang <br>
 * Date: 2017-03-31 13:46:00
 */

public interface OrdSubOrderService {
    /**
     * 新增
     *
     * @param ordSubOrderList 新增的实体集合
     * @return 新增是否成功
     */
    void batchSave(List<OrdSubOrder> ordSubOrderList);

    /**
     * 根据orderNos查询实体
     *
     * @param orderNo
     * @return
     */
    void deleteByOrderNo(String orderNo);

    /**
     * 根据子单的运单编号（subOrderNo）查询子订单对应的实体
     *
     * @param subOrderNo 子订单号
     * @return
     */
    OrdSubOrder findBySubOrderNo(String subOrderNo);

    /**
     * 根据子订单编号（suborderNo）查询子订单的dto信息
     *
     * @param subOrderNo 子订单编号
     * @return 子订单dto信息
     */
    OrdSubOrderDto findDtoBySubOrderNo(String subOrderNo);

    /**
     * 根据子单的运单编号集合（subOrderNos）查询子订单对应的实体
     *
     * @param subOrderNos
     * @return
     */
    List<OrdSubOrder> findBySubOrderNos(List<String> subOrderNos);

    /**
     * 根据子订单编号集合获取子订单dto信息
     *
     * @param subOrderNos 子订单运单集合
     * @return 子订单dto信息集合
     */
    List<OrdSubOrderDto> findDtoBySubOrderNos(List<String> subOrderNos);

    /**
     * 根据orderNos查询实体
     *
     * @param orderNos
     * @return
     */
    List<OrdSubOrder> findByOrderNos(List<String> orderNos);

    List<OrdSubOrder> findByOrderNo(String orderNo);
    Map<String,OrdSubOrder> findMapByOrderNo(String orderNo);

    List<OrdSubOrderDto> findDtoByOrderNo(String orderNo);

    /**
     * 根据订单号，批量获取子单dto
     *
     * @param orderNos
     * @return
     */
    Map<String, List<OrdSubOrderDto>> findMapDtosByOrderNos(List<String> orderNos);

    /**
     * 根据条件查询实体
     *
     * @param params 查询的参数集
     * @return 查询出的数据
     */
    QResultDto findByParam(QueryParams params);

    void checkCode(Integer id, String code);

    /**
     * 修改子订单的状态
     *
     * @param subOrderNo
     * @param orderStatus
     * @return
     */
    /**
     void updateOrderStatus(String subOrderNo, OrderStatus orderStatus);
     **/
    /**
     * 根据指定的子订单号更新对应的子订单的状态
     *
     * @param subOrderNos 子订单集合
     * @param orderStatus 订单状态
     */
    void updateOrderStatus(List<String> subOrderNos, OrderStatus orderStatus);

    /***
     * 根据订单的编号，更新子订单的状态
     * @param processOrderMap
     */
    void updateOrderStatusByOrderNos(Map<String, OrderStatus> processOrderMap);
    void updateOrderStatusByOrderNo(String orderNo,OrderStatus orderStatus);

    /**
     * 更新子单
     *
     * @param subOrder
     * @return
     */
    void update(OrdSubOrder subOrder);

    void batchUpdate(List<OrdSubOrder> subOrderList);

    /**
     * 根据订单的编号从子订单中找到最慢的状态
     *
     * @return
     */
    OrderStatus getMinStatusCodeByOrderNo(String orderNo);

    List<OrdSubOrder> getMinStatusByOrderNos(List<String> orderNos);

    OrdSubOrder getMinStatusByOrderNo(String orderNo);

    /**
     * 根据订单编号获取所有的子订单编号
     *
     * @param orderNo
     * @return
     */
    List<String> getSubOrdNos(String orderNo);


    /**
     * 根据订单号，批量修改子订单的状态
     *
     * @param orderNo
     * @param orderStatus
     */
    /**
     void batchUpdateStatus(String orderNo, OrderStatus orderStatus);
     **/
    /**
     * 根据订单，批量增加子单的物流信息(订单提交时)
     *
     * @param orderNo
     * @param waybillNo
     * @param orderStatus
     * @param subOrderNos
     */
    void batchAddSubTracking(String orderNo, String waybillNo, OrderStatus orderStatus, List<String> subOrderNos);

    /**
     * 根据订单，批量增加子单的物流信息(订单提交时)
     *
     * @param orderNo
     * @param waybillNo
     * @param orderStatus
     * @param subOrderNos
     * @return 不保存，只返回集合
     */
    List<OrdOrderTracking> batchAddSubTrackings(String orderNo, String waybillNo, OrderStatus orderStatus, List<String> subOrderNos);

    List<OrdOrderTracking> processOrderTracking(String orderNo, String waybillNo, List<String> subOrderNoList, List<String> codeList);

    Map<String, List<String>> findMapByOrderNos(List<String> orderNoList);

    List<String> findSubOrderNoByOrderNo(String orderNo);

    int checkSubOrOrderNo(int type, String number);


    /**
     * 根据statuscode 更新子单的状态. 注意，调用这个方法的地方，要确定是否要调用orderservice中的updatestatus，
     * 因为订单的状态，由子单状态驱动
     */

    void updateOrderNoByOrderNo(String oldOrderNo, String newOrderNo);

    void updateOrderStatus(Map<String, OrderStatus> updateSubOrderNoMap);

    Map<String, String> findWaybillNoOrderNoMapBySubOrders(List<String> subOrderNos);

    /**
     * 根据订单号、子单个数、订单状态
     *
     *
     * @param orderNo
     * @param waybillNo     订单编号
     * @param packageNum  子单个数
     * @param orderStatus 订单的状态
     * @return 子订单的订单编号集合
     */
    List<String> saveSubOrders(String orderNo, String waybillNo, int packageNum, OrderStatus orderStatus);

    /**
     * 生成子单号
     * @param waybillNo
     * @param packageNum
     * @return
     */
    List<String> generateSubOrderNo(String waybillNo,int packageNum);
}
